/**
 */
package tpi.obj3.planificador.planificador.impl;

import java.util.Collection;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;

import org.eclipse.emf.common.util.EList;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;

import org.eclipse.emf.ecore.impl.ENotificationImpl;

import org.eclipse.emf.ecore.util.EObjectContainmentEList;
import org.eclipse.emf.ecore.util.EObjectResolvingEList;
import org.eclipse.emf.ecore.util.InternalEList;

import tpi.obj3.planificador.planificador.Clase;
import tpi.obj3.planificador.planificador.Materia;
import tpi.obj3.planificador.planificador.Planificacion;
import tpi.obj3.planificador.planificador.PlanificadorPackage;

/**
 * <!-- begin-user-doc -->
 * An implementation of the model object '<em><b>Planificacion</b></em>'.
 * <!-- end-user-doc -->
 * <p>
 * The following features are implemented:
 * <ul>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getAnio <em>Anio</em>}</li>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getSemestre <em>Semestre</em>}</li>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getMaterias <em>Materias</em>}</li>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getClasesLunes <em>Clases Lunes</em>}</li>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getClasesMartes <em>Clases Martes</em>}</li>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getClasesMiercoles <em>Clases Miercoles</em>}</li>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getClasesJueves <em>Clases Jueves</em>}</li>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getClasesViernes <em>Clases Viernes</em>}</li>
 *   <li>{@link tpi.obj3.planificador.planificador.impl.PlanificacionImpl#getClasesSabado <em>Clases Sabado</em>}</li>
 * </ul>
 * </p>
 *
 * @generated
 */
public class PlanificacionImpl extends ElementoImpl implements Planificacion
{
  /**
   * The default value of the '{@link #getAnio() <em>Anio</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getAnio()
   * @generated
   * @ordered
   */
  protected static final int ANIO_EDEFAULT = 0;

  /**
   * The cached value of the '{@link #getAnio() <em>Anio</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getAnio()
   * @generated
   * @ordered
   */
  protected int anio = ANIO_EDEFAULT;

  /**
   * The default value of the '{@link #getSemestre() <em>Semestre</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getSemestre()
   * @generated
   * @ordered
   */
  protected static final int SEMESTRE_EDEFAULT = 0;

  /**
   * The cached value of the '{@link #getSemestre() <em>Semestre</em>}' attribute.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getSemestre()
   * @generated
   * @ordered
   */
  protected int semestre = SEMESTRE_EDEFAULT;

  /**
   * The cached value of the '{@link #getMaterias() <em>Materias</em>}' reference list.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getMaterias()
   * @generated
   * @ordered
   */
  protected EList<Materia> materias;

  /**
   * The cached value of the '{@link #getClasesLunes() <em>Clases Lunes</em>}' containment reference list.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getClasesLunes()
   * @generated
   * @ordered
   */
  protected EList<Clase> clasesLunes;

  /**
   * The cached value of the '{@link #getClasesMartes() <em>Clases Martes</em>}' containment reference list.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getClasesMartes()
   * @generated
   * @ordered
   */
  protected EList<Clase> clasesMartes;

  /**
   * The cached value of the '{@link #getClasesMiercoles() <em>Clases Miercoles</em>}' containment reference list.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getClasesMiercoles()
   * @generated
   * @ordered
   */
  protected EList<Clase> clasesMiercoles;

  /**
   * The cached value of the '{@link #getClasesJueves() <em>Clases Jueves</em>}' containment reference list.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getClasesJueves()
   * @generated
   * @ordered
   */
  protected EList<Clase> clasesJueves;

  /**
   * The cached value of the '{@link #getClasesViernes() <em>Clases Viernes</em>}' containment reference list.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getClasesViernes()
   * @generated
   * @ordered
   */
  protected EList<Clase> clasesViernes;

  /**
   * The cached value of the '{@link #getClasesSabado() <em>Clases Sabado</em>}' containment reference list.
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @see #getClasesSabado()
   * @generated
   * @ordered
   */
  protected EList<Clase> clasesSabado;

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  protected PlanificacionImpl()
  {
    super();
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  protected EClass eStaticClass()
  {
    return PlanificadorPackage.Literals.PLANIFICACION;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public int getAnio()
  {
    return anio;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setAnio(int newAnio)
  {
    int oldAnio = anio;
    anio = newAnio;
    if (eNotificationRequired())
      eNotify(new ENotificationImpl(this, Notification.SET, PlanificadorPackage.PLANIFICACION__ANIO, oldAnio, anio));
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public int getSemestre()
  {
    return semestre;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public void setSemestre(int newSemestre)
  {
    int oldSemestre = semestre;
    semestre = newSemestre;
    if (eNotificationRequired())
      eNotify(new ENotificationImpl(this, Notification.SET, PlanificadorPackage.PLANIFICACION__SEMESTRE, oldSemestre, semestre));
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public EList<Materia> getMaterias()
  {
    if (materias == null)
    {
      materias = new EObjectResolvingEList<Materia>(Materia.class, this, PlanificadorPackage.PLANIFICACION__MATERIAS);
    }
    return materias;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public EList<Clase> getClasesLunes()
  {
    if (clasesLunes == null)
    {
      clasesLunes = new EObjectContainmentEList<Clase>(Clase.class, this, PlanificadorPackage.PLANIFICACION__CLASES_LUNES);
    }
    return clasesLunes;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public EList<Clase> getClasesMartes()
  {
    if (clasesMartes == null)
    {
      clasesMartes = new EObjectContainmentEList<Clase>(Clase.class, this, PlanificadorPackage.PLANIFICACION__CLASES_MARTES);
    }
    return clasesMartes;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public EList<Clase> getClasesMiercoles()
  {
    if (clasesMiercoles == null)
    {
      clasesMiercoles = new EObjectContainmentEList<Clase>(Clase.class, this, PlanificadorPackage.PLANIFICACION__CLASES_MIERCOLES);
    }
    return clasesMiercoles;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public EList<Clase> getClasesJueves()
  {
    if (clasesJueves == null)
    {
      clasesJueves = new EObjectContainmentEList<Clase>(Clase.class, this, PlanificadorPackage.PLANIFICACION__CLASES_JUEVES);
    }
    return clasesJueves;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public EList<Clase> getClasesViernes()
  {
    if (clasesViernes == null)
    {
      clasesViernes = new EObjectContainmentEList<Clase>(Clase.class, this, PlanificadorPackage.PLANIFICACION__CLASES_VIERNES);
    }
    return clasesViernes;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  public EList<Clase> getClasesSabado()
  {
    if (clasesSabado == null)
    {
      clasesSabado = new EObjectContainmentEList<Clase>(Clase.class, this, PlanificadorPackage.PLANIFICACION__CLASES_SABADO);
    }
    return clasesSabado;
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs)
  {
    switch (featureID)
    {
      case PlanificadorPackage.PLANIFICACION__CLASES_LUNES:
        return ((InternalEList<?>)getClasesLunes()).basicRemove(otherEnd, msgs);
      case PlanificadorPackage.PLANIFICACION__CLASES_MARTES:
        return ((InternalEList<?>)getClasesMartes()).basicRemove(otherEnd, msgs);
      case PlanificadorPackage.PLANIFICACION__CLASES_MIERCOLES:
        return ((InternalEList<?>)getClasesMiercoles()).basicRemove(otherEnd, msgs);
      case PlanificadorPackage.PLANIFICACION__CLASES_JUEVES:
        return ((InternalEList<?>)getClasesJueves()).basicRemove(otherEnd, msgs);
      case PlanificadorPackage.PLANIFICACION__CLASES_VIERNES:
        return ((InternalEList<?>)getClasesViernes()).basicRemove(otherEnd, msgs);
      case PlanificadorPackage.PLANIFICACION__CLASES_SABADO:
        return ((InternalEList<?>)getClasesSabado()).basicRemove(otherEnd, msgs);
    }
    return super.eInverseRemove(otherEnd, featureID, msgs);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  public Object eGet(int featureID, boolean resolve, boolean coreType)
  {
    switch (featureID)
    {
      case PlanificadorPackage.PLANIFICACION__ANIO:
        return getAnio();
      case PlanificadorPackage.PLANIFICACION__SEMESTRE:
        return getSemestre();
      case PlanificadorPackage.PLANIFICACION__MATERIAS:
        return getMaterias();
      case PlanificadorPackage.PLANIFICACION__CLASES_LUNES:
        return getClasesLunes();
      case PlanificadorPackage.PLANIFICACION__CLASES_MARTES:
        return getClasesMartes();
      case PlanificadorPackage.PLANIFICACION__CLASES_MIERCOLES:
        return getClasesMiercoles();
      case PlanificadorPackage.PLANIFICACION__CLASES_JUEVES:
        return getClasesJueves();
      case PlanificadorPackage.PLANIFICACION__CLASES_VIERNES:
        return getClasesViernes();
      case PlanificadorPackage.PLANIFICACION__CLASES_SABADO:
        return getClasesSabado();
    }
    return super.eGet(featureID, resolve, coreType);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @SuppressWarnings("unchecked")
  @Override
  public void eSet(int featureID, Object newValue)
  {
    switch (featureID)
    {
      case PlanificadorPackage.PLANIFICACION__ANIO:
        setAnio((Integer)newValue);
        return;
      case PlanificadorPackage.PLANIFICACION__SEMESTRE:
        setSemestre((Integer)newValue);
        return;
      case PlanificadorPackage.PLANIFICACION__MATERIAS:
        getMaterias().clear();
        getMaterias().addAll((Collection<? extends Materia>)newValue);
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_LUNES:
        getClasesLunes().clear();
        getClasesLunes().addAll((Collection<? extends Clase>)newValue);
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_MARTES:
        getClasesMartes().clear();
        getClasesMartes().addAll((Collection<? extends Clase>)newValue);
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_MIERCOLES:
        getClasesMiercoles().clear();
        getClasesMiercoles().addAll((Collection<? extends Clase>)newValue);
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_JUEVES:
        getClasesJueves().clear();
        getClasesJueves().addAll((Collection<? extends Clase>)newValue);
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_VIERNES:
        getClasesViernes().clear();
        getClasesViernes().addAll((Collection<? extends Clase>)newValue);
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_SABADO:
        getClasesSabado().clear();
        getClasesSabado().addAll((Collection<? extends Clase>)newValue);
        return;
    }
    super.eSet(featureID, newValue);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  public void eUnset(int featureID)
  {
    switch (featureID)
    {
      case PlanificadorPackage.PLANIFICACION__ANIO:
        setAnio(ANIO_EDEFAULT);
        return;
      case PlanificadorPackage.PLANIFICACION__SEMESTRE:
        setSemestre(SEMESTRE_EDEFAULT);
        return;
      case PlanificadorPackage.PLANIFICACION__MATERIAS:
        getMaterias().clear();
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_LUNES:
        getClasesLunes().clear();
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_MARTES:
        getClasesMartes().clear();
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_MIERCOLES:
        getClasesMiercoles().clear();
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_JUEVES:
        getClasesJueves().clear();
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_VIERNES:
        getClasesViernes().clear();
        return;
      case PlanificadorPackage.PLANIFICACION__CLASES_SABADO:
        getClasesSabado().clear();
        return;
    }
    super.eUnset(featureID);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  public boolean eIsSet(int featureID)
  {
    switch (featureID)
    {
      case PlanificadorPackage.PLANIFICACION__ANIO:
        return anio != ANIO_EDEFAULT;
      case PlanificadorPackage.PLANIFICACION__SEMESTRE:
        return semestre != SEMESTRE_EDEFAULT;
      case PlanificadorPackage.PLANIFICACION__MATERIAS:
        return materias != null && !materias.isEmpty();
      case PlanificadorPackage.PLANIFICACION__CLASES_LUNES:
        return clasesLunes != null && !clasesLunes.isEmpty();
      case PlanificadorPackage.PLANIFICACION__CLASES_MARTES:
        return clasesMartes != null && !clasesMartes.isEmpty();
      case PlanificadorPackage.PLANIFICACION__CLASES_MIERCOLES:
        return clasesMiercoles != null && !clasesMiercoles.isEmpty();
      case PlanificadorPackage.PLANIFICACION__CLASES_JUEVES:
        return clasesJueves != null && !clasesJueves.isEmpty();
      case PlanificadorPackage.PLANIFICACION__CLASES_VIERNES:
        return clasesViernes != null && !clasesViernes.isEmpty();
      case PlanificadorPackage.PLANIFICACION__CLASES_SABADO:
        return clasesSabado != null && !clasesSabado.isEmpty();
    }
    return super.eIsSet(featureID);
  }

  /**
   * <!-- begin-user-doc -->
   * <!-- end-user-doc -->
   * @generated
   */
  @Override
  public String toString()
  {
    if (eIsProxy()) return super.toString();

    StringBuffer result = new StringBuffer(super.toString());
    result.append(" (anio: ");
    result.append(anio);
    result.append(", semestre: ");
    result.append(semestre);
    result.append(')');
    return result.toString();
  }

} //PlanificacionImpl
